#include <atomic>
#include <thread>
#include <assert.h>
#include <iostream>

std::atomic<bool>x, y;
std::atomic<int> z;
/***
 * 原子变量 原子操作 原子性
 * 内存序:  可见性(同步)     指导优化(编译器和处理器对指令的重新排序)  
 * std::memory_order_relaxed      无同步和顺序约束  
 * 
 * std::memory_order_release  用于写(释放语义)   保证可见性 并指导优化(1.不会将release操作​之后​​的内存操作重排序到release​​之前​ 2.允许将release操作​之前​​的内存操作重排序到release​​之后​​​)
 * 
 * std::memory_order_acquire  用于读(获取语义)   保证一定可以读到最新的  并指异优化(1.不会将acquire操作之前​​的内存操作重排序到acquire​​之后​​ 2.允许将acquire操作​之后​​的内存操作重排序到acquire​​之前​)
 * 
 * std::memory_order_seq_cst  全局顺序一致
 */

void write_x_then_y() {
    x.store(true, std::memory_order_relaxed);
    y.store(true, std::memory_order_relaxed);
}

void read_y_then_x() {
    while (!y.load(std::memory_order_relaxed)) {}

    if (x.load(std::memory_order_relaxed)) {
        ++z;
    }    
}
/**
void write_x_then_y() {
    x.store(true, std::memory_order_relaxed);
    y.store(true, std::memory_order_release);
}

void read_y_then_x() {
    while (!y.load(std::memory_order_acquire)) {}

    if (x.load(std::memory_order_relaxed)) {
        ++z;
    }    
} */

int main (){
    for (int i = 0; i < 100000; i++) {
        x = false;
        y = false;
        z = 0;
        std::thread b(read_y_then_x);
        std::thread c(write_x_then_y);
        b.join();
        c.join();
        int v = z.load(std::memory_order_relaxed);
        std::cout << "result:" << v << std::endl;
        if (v != 1) {
            std::cout << v << std::endl;
        }
    }
    std::cout << "end" << std::endl;
    return 0;
}